using System.Runtime.Serialization;
using System.Text.Json.Serialization;

namespace Acme.MeiTuan.SDK.PushRequest;

[JsonNumberHandling(JsonNumberHandling.AllowReadingFromString)]
public class MeiTuanOrderPartRefundDto
{
    public string? order_id { get; set; }
    /// <summary>
    /// 通知类型，
    /// part：发起部分退款；
    /// agree：确认退款；
    /// reject：驳回退款；
    /// cancelRefund：用户取消退款申请；
    /// cancelRefundComplaint：用户取消退款申诉；
    /// 支持退货退款业务的门店，订单退款消息中notify_type和res_type字段不返回，退款状态类型请参考status字段。未开通退货退款业务的门店，订单退款保持原逻辑不变。
    /// </summary>
    public string? notify_type { get; set; }
    /// <summary>
    /// 本次退款申请的退款id，可用于商家区分多次部分退款。
    /// </summary>
    public string? refund_id { get; set; }
    /// <summary>
    /// 本次退款申请的发起时间
    /// </summary>
    public int ctime { get; set; }
    /// <summary>
    /// 申请退款的原因
    /// </summary>
    public string? reason { get; set; }
    /// <summary>
    /// 部分退款商品信息，json格式数组。
    /// </summary>
    [IgnoreDataMember]
    [JsonIgnore]
    public string? food { get; set; }

    public List<Food>? foodObj { get; set; }
    /// <summary>
    /// 本次退款的合计金额，单位是元。
    /// </summary>
    public decimal money { get; set; }
    /// <summary>
    /// 退款状态类型，参考值：
    /// 0等待处理中；
    /// 1商家驳回退款请求；
    /// 2商家同意退款；
    /// 3客服驳回退款请求；
    /// 4客服帮商家同意退款；
    /// 5超时未处理系统自动同意；
    /// 6系统自动确认；
    /// 7用户取消退款申请；
    /// 8用户取消退款申诉。
    /// 支持退货退款业务的门店，订单退款消息中notify_type和res_type字段不返回，退款状态类型请参考status字段。未开通退货退款业务的门店，订单退款保持原逻辑不变。
    /// </summary>
    public int res_type { get; set; }
    /// <summary>
    /// 本次申请是否为用户申诉退款，参考值：0否；1是。目前部分退款不支持申诉。
    /// </summary>
    public int is_appeal { get; set; }
    /// <summary>
    /// 用户申请退款时上传的退款图片，多个图片url以英文逗号隔开，上限为9张图片。字段信息为json格式数组。
    /// </summary>
    [IgnoreDataMember]
    [JsonIgnore]
    public string? pictures { get; set; }

    public string[]? picturesObj { get; set; }
    /// <summary>
    /// 退款服务类型, 区分是否已开通退货退款售后业务。
    /// 未开通的场景：
    /// 0退款流程或申诉流程 已开通场景：
    /// 1仅退款流程 2退款退货流程
    /// </summary>
    public string? service_type { get; set; }
    /// <summary>
    /// 开通退货退款业务的门店，本参数推送当前售后单的状态类型，仅适用支持退货退款业务的商家：
    /// 1已申请
    /// 10初审已同意
    /// 11初审已驳回
    /// 16初审已申诉
    /// 17初审申诉已同意
    /// 18初审申诉已驳回
    /// 20终审已发起（用户已发货）
    /// 21终审已同意
    /// 22终审已驳回
    /// 26终审已申诉
    /// 27终审申诉已同意
    /// 28终审申诉已驳回
    /// 30已取消
    /// </summary>
    public string? status { get; set; }
    /// <summary>
    /// 推送当前仅退款或退货退款流程的发起方，是用户还是商家；仅适用于支持退货退款的商家。
    /// 1用户
    /// 2商家
    /// 3客服
    /// 4BD
    /// 5系统
    /// 6开放平台
    /// </summary>
    public string? apply_op_user_type { get; set; }
    /// <summary>
    /// 物流信息集合，仅适用支持退货退款业务的品类；在用户提交物流信息以及商家终审的推送消息中展示
    /// 先不做处理
    /// </summary>
    [IgnoreDataMember]
    [JsonIgnore]
    public string? logistics_info { get; set; }
    /// <summary>
    /// 订单数据状态标记。当订单中部分字段的数据因内部交互异常或网络等原因延迟生成（超时），导致开发者当前获取的订单数据不完整，此时平台对订单数据缺失情况进行标记。如不完整，建议尝试重新查询。注意，平台仅对部分模块的数据完整性进行监察标记（参考incmp_modules字段）。参考值： 1：有数据降级 0：无数据降级
    /// </summary>
    public int? incmp_code { get; set; }
    /// <summary>
    /// 有降级的数据模块的集合，参考值： 0：订单商品详情 1：订单优惠信息 2：商品优惠详情 3：订单用户会员信息 4：订单纬度的商家对账信息 5：订单纬度的商家对账信息(元) 6：订单收货人地址 7：订单配送方式 8：开放平台用户id 9：部分退款商品信息 10：退货退款物流信息 11：部分订单基本信息(包括订单优惠信息、订单商品详情、门店信息等) 12：sku信息 13：spu信息 14：商品信息(可能是sku或spu等商品相关信息获取时降级)
    /// </summary>
    [IgnoreDataMember]
    [JsonIgnore]
    public string? incmp_modules { get; set; }

    public HashSet<int>? incmp_modules_obj { get; set; }
}

/// <summary>
/// 部分退款商品信息，json格式数组。
/// </summary>
public class Food
{
    /// <summary>
    /// APP方商品id，即商家中台系统里商品的编码(spu_code值)：(1)不同门店之间商品id可以重复，同一门店内商品id不允许重复。(2)字段信息限定长度不超过128个字符。
    /// </summary>
    public string? app_food_code { get; set; }
    /// <summary>
    /// 退款商品名称
    /// </summary>
    public string? food_name { get; set; }
    /// <summary>
    /// SKU码(商家的规格编码)，是商品sku唯一标识码。
    /// </summary>
    public string? sku_id { get; set; }
    /// <summary>
    /// 商品的UPC码信息，即商品包装上的UPC/EAN码编号，长度一般8位或者13位。是商家同步商品信息时维护的UPC码，同一门店内，商品UPC码不允许重复。
    /// </summary>
    public string? upc { get; set; }
    /// <summary>
    /// 商品sku的规格名称
    /// </summary>
    public string? spec { get; set; }
    /// <summary>
    /// 当前商品sku参加商品类活动优惠后的金额（单价），单位是元。
    /// </summary>
    public decimal food_price { get; set; }
    /// <summary>
    /// 本次退款的商品sku数量，如为退差价流程，则此字段信息为0。
    /// </summary>
    public int count { get; set; }
    /// <summary>
    /// 单件商品sku需使用的包装盒数量，同商家同步商品时维护的此相同字段的信息。
    /// </summary>
    public decimal box_num { get; set; }
    /// <summary>
    /// 当前商品sku需使用包装盒的单价，即单个包装盒的价格，单位是元。
    /// </summary>
    public decimal box_price { get; set; }
    /// <summary>
    /// 当前商品sku原价（单价），单位是元。
    /// </summary>
    public decimal origin_food_price { get; set; }
    /// <summary>
    /// 当前商品sku单件可退金额（扣减商品所参加的所有营销活动优惠分摊后的金额），单位是元。 如本次部分退款是按件部分退，则此金额为商品sku单件的退款金额；如本次为按重量退差价，则此金额为商品sku差异克重的退款金额。 示例：商品标价重量为500g，实拣重量为400g，商品可退金额为2.4元，那么本次退差价的退款金额=[(标价重量实拣重量）/标价重量]*商品可退金额，即[(500400)/500]*2.4=0.48元。
    /// </summary>
    public decimal refund_price { get; set; }
    /// <summary>
    /// 已退重量，单位是克/g。当本次退款为按克重退差价，此字段信息为单件商品sku实拣重量与标价重量的差值。
    /// </summary>
    public decimal refunded_weight { get; set; }
}